package esc1Caso2;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import aima.search.framework.Successor;
import aima.search.framework.SuccessorFunction;

public class FuncionSuccesores implements SuccessorFunction{
	
	boolean SA;
	
	public FuncionSuccesores(boolean SA) {
		this.SA = SA;
	}

	@Override
	public List<Successor> getSuccessors(Object arg0) {
		Estado estado = (Estado) arg0;
		ArrayList<Successor> succesores = new ArrayList<Successor>();
		if (SA) {
			// Generar un solo sucesor random
			// Cogemos peticion random
			int numPeticion = estado.getRandom().nextInt(estado.getAsignaciones().size());  
			
			int fichero = estado.getPeticiones().getRequest(numPeticion)[1];
			Set<Integer> servidoresDisponibles = estado.getServidores().fileLocations(fichero);
			
			// Cogemos un server nuevo random
			int servidorNuevo = estado.getRandom().nextInt(servidoresDisponibles.size());
			Estado succesor = estado.getCopia();
			succesor.moverPeticion(numPeticion, servidorNuevo);
			succesores.add(new Successor("MOVER", succesor));
		}
		else {
			//Generar succesores
			ArrayList<Integer> asignaciones = estado.getAsignaciones();
			for(int numPeticion = 0; numPeticion < asignaciones.size(); numPeticion++){
				int servidorAsignado = asignaciones.get(numPeticion);
				int peticion[] = estado.getPeticiones().getRequest(numPeticion);
				int fichero = peticion[1];
				Set<Integer> servidoresDisponibles = estado.getServidores().fileLocations(fichero);
				
				for(Integer servidorNuevo : servidoresDisponibles){
		            if(servidorAsignado != servidorNuevo){
		            	Estado succesor = estado.getCopia();
						succesor.moverPeticion(numPeticion, servidorNuevo);
						succesores.add(new Successor("MOVER", succesor));
		            }
		        }
			}

		}
		return succesores;
	}

}
